home *** CD-ROM | disk | FTP | other *** search
- ; ED11.A -- Screen and keyboard interface routines for the PC
- ;
- ; This is a modified version of the PCIO.A routines included with the
- ; C ware (Desmet) C compiler and included with permission of
- ; C ware
- ;
-
- dseg
- ;
- ; CHARACTER ATTRIBUTE EQUATES
- ;
- NORMAL EQU 7
- REVERSE EQU 112
- BLINK EQU 128
- INTENSE EQU 8
- ;
- ; ATTRIBUTE SET CODES
- ;
- SETNORMAL EQU 0
- SETREVERSE EQU 1
- SETINTENSE EQU 2
- SETFAINT EQU 3
- SETBLINK EQU 4
- NOBLINK EQU 5
- ;
-
- ;/* control key translations */
- UP1 EQU 10
- DOWN1 EQU 13
- UP2 EQU 21
- DOWN2 EQU 4
- LEFT1 EQU 25
- RIGHT1 EQU 18
- INS1 EQU 14
- EDIT1 EQU 5
- ESC1 EQU 27
- DEL1 EQU 127
- ZAP1 EQU 26
- ABT1 EQU 24
- SPLT1 EQU 19
- JOIN1 EQU 16
- DTOCH EQU 1
- GTOCH EQU 2
- HOME EQU 6
- DSCROL EQU 7
- GOTO EQU 17
- LSTRT EQU 11
- LEND EQU 12
- USCROL EQU 15
- ERASE EQU 20
- LFTDEL EQU 8
- BEGINPL EQU 200
- ENDPL EQU 201
- PUTIT EQU 202
- PICKIT EQU 203
- RECORD EQU 204
- REPLAY EQU 205
- ABSLEFT EQU 206
- ABSRGHT EQU 207
- PAGEUP EQU 208
- PAGEDN EQU 209
-
- ; the table that is used to make the translation
-
- convert:
- db 72, UP2 ;up_char
- db 80, DOWN2 ;down_char
- db 75, LEFT1 ;left_char
- db 77, RIGHT1 ;right_char
- db 71, HOME ;home
- db 79, DEL1 ;end
- db 73, USCROL ;pageup_char
- db 81, DSCROL ;pagedown_char
- db 82, UP1 ;Ins_char
- db 83, ZAP1 ;Del_char
- db 115, LSTRT ;ctl-left
- db 116, LEND ;ctl-rgt
- db 59, ESC1 ;F1
- db 60, EDIT1 ;F2
- db 61, GOTO ;F3
- db 62, INS1 ;F4
- db 63, ERASE ;F5
- db 64, ABT1 ;F6
- db 65, BEGINPL ;F7
- db 66, ENDPL ;F8
- db 67, PICKIT ;F9
- db 68, PUTIT ;F10
- db 120,SPLT1 ;alt-1
- db 121,JOIN1 ;alt-2
- db 122,DTOCH ;alt-3
- db 123,GTOCH ;alt-4
- db 130,ABSLEFT ;alt -
- db 131,ABSRGHT ;alt +
- db 132,PAGEUP ;ctl-Pg Up
- db 118,PAGEDN ;ctl-Pg Dn
- db 0, 255 ; illegal character
-
- ; equates for bios interface.
-
- ; the interrupt and codes for the screen interface interrupt.
-
- video equ 10h ;interrupt for dealing with screen
-
- mode equ 0 ;code for setting new screen mode
- curtype equ 1 ;code for setting new cursor type
- setcur equ 2 ;code for addressing cursor
- readcur equ 3 ;code for reading cursor location
- readlp equ 4 ;code for reading light pen position
- setpage equ 5 ;code to select active page
- scrollup equ 6 ;code to scroll screen up
- scrolldn equ 7 ;code to scroll screen nown
- readch equ 8 ;code to read a character from screen
- writeach equ 9 ;code to write char and attributes
- writech equ 10 ;code to write character only
- setpal equ 11 ;code to set new setpal or border
- wdot equ 12 ;code to write a dot
- rdot equ 13 ;code to read a dot
- wtty equ 14 ;code to write as if teletype
- state equ 15 ;code to find current screen status
-
-
-
- ; the interrupt and codes for the keyboard interface.
-
- keyboard equ 16h ;interrupt 16 to deal with keyboard
-
- cicode equ 0 ;code for reading a character
- cstscode equ 1 ;code for keyboard status
-
-
-
-
- ; caution: must change column number if 40 column mode
-
- crt_cols equ 80
-
- ; variables available to a C88 program
-
- public scr_cols_, scr_rows_
- public scr_mode_,scr_page_,scr_attr_
-
- scr_cols_: dw crt_cols ;current number of columns
- scr_rows_: dw 25 ;current number of rows
- scr_mode_ db 0 ;current screen mode
- scr_page_ db 0 ;current page
- scr_attr_ db NORMAL ;current attributes for screen
- ;NORMAL is white letters on black
-
-
-
- cseg
-
- ; SCR_SETUP_ scr_setup must be called before any use of any
- ; other routine unless the starting mode is 80X25
- ; character mode (3,4 or 7).
-
- ; Usage: scr_setup();
-
- public scr_setup_
- scr_setup_: push bp
- mov ah,state ;get current state
- int video
- mov scr_mode_,al ;current mode
- mov cl,ah ;make cols a word
- mov ch,0
- mov scr_cols_,cx ;40 or 80 columns
- mov scr_page_,bh
- mov scr_attr_,NORMAL ;set to white chars on black
- cmp al,4 ;see if a character mode
- jc got_attr
- cmp al,7 ;7 is for graphics mode
- jz got_attr
- mov scr_attr_,0 ;attribute is zero in graphics
- got_attr: mov ah,0 ;return int containing mode
- pop bp
- ret
-
-
-
- ; SCR_SETMODE_ set a new screen mode
-
- ; Usage: scr_setmode(new mode);
-
- public scr_setmode_
- scr_setmode_: push bp
- mov bp,sp
- mov al,[bp+4] ; new mode value
- mov ah,mode
- int video ; set new mode
- call scr_setup_ ;remember new values
- pop bp
- ret
-
-
- ; SCR_ROWCOL_ sets cursor at any location.
-
- ; Usage: scr_rowcol(new row, new column);
-
- public scr_rowcol_
- scr_rowcol_: ; move cursor to x,y
- push bp ; save from bios
- mov bp,sp
- mov dx,[bp+6] ; column
- mov ax,[bp+4] ; row
- mov dh,al
- mov bh,scr_page_ ; force page zero
- mov ah,setcur ; set cursor location
- int video ; call bios
- pop bp
- ret
-
-
-
- ; SCR_CLR_ clear entire screen
-
- ; Usage: scr_clr();
-
- public scr_clr_
- scr_clr_: ; clear screen
-
-
- push bp ;save from video call
- mov al,0 ;ask for a clear window
- xor cx,cx ;start at 0,0
- mov dh,24 ;24 is the last line
- mov dl,byte scr_cols_ ;clear entire width
- dec dl ;last column is width-1
- mov bh,scr_attr_ ;attributes for new blanks
- mov ah,scrollup ;ask for a scrollup to clear
- int video ;do the clear
- pop bp
- ret
-
-
-
- ; SCR_CLRL_ clear rest of line.
-
- ; Usage: scr_clrl();
-
- public scr_clrl_
- scr_clrl_: ; clear rest of line
- push bp
- mov ah,readcur ;see where we are
- int video
- mov cl,byte scr_cols_ ;calc how many chars left in line
- sub cl,dl ;number left
- mov ch,0 ;number of blanks needed
- mov al,' ' ;write blanks
- mov bl,scr_attr_ ;normal attributes
- mov ah,writeach ;write the blanks
- int video
- pop bp
- ret
-
-
-
-
-
- ; SCR_SCUP_ scroll text up leaving top line alone.
-
- ; Usage: scr_scup();
-
- public scr_scup_
- scr_scup_: ; scroll last line, screen from line 2 to 24
- mov ax,scr_cols_ ;need last column of screen
- dec ax
- push ax
- mov ax,24 ;scroll through last line
- push ax
- xor ax,ax ;from column 0
- push ax
- inc ax ;leave top line alone
- push ax
- push ax ;scroll by 1
- call scr_scrup_ ;do the scroll
- add sp,10 ;clear arge
- ret
-
-
- ; SCR_SCDN_ scroll all but the top line down one.
-
- ; Usage: scr_scdn();
-
- public scr_scdn_
- scr_scdn_:
- mov ax,scr_cols_ ;need last column of screen
- dec ax
- push ax
- mov ax,24 ;scroll through last line
- push ax
- xor ax,ax ;from column 0
- push ax
- inc ax ;leave top line alone
- push ax
- push ax ;scroll by 1
- call scr_scrdn_ ;do the scroll
- add sp,10 ;clear arge
- ret
-
- push ax
- xor ax,ax ;from column 0
- push ax
- inc ax ;leave top line alone
- push ax
- push ax ;scroll by 1
- call scr_scrup_ ;do the scroll
- add sp,10 ;clear arge
- ret
-
- ; SCR_SCRUP_ Scroll the screen up. The window is scrolled
- ; up nline lines. A zero nline will clear the
- ; window. Top left of the screen in 0,0.
-
- ; Usage: scr_scrup(nline,fromrow,fromcol,torow,tocol);
-
- public scr_scrup_
- scr_scrup_: push bp
- mov bp,sp
- mov al,[bp+4] ;number of lines
- mov ch,[bp+6] ;starting row
- mov cl,[bp+8] ;starting column
- mov dh,[bp+10] ;ending row
- mov dl,[bp+12] ;ending column
- mov bh,scr_attr_ ;current attribute
- mov ah,scrollup
- int video ;do the scroll
- pop bp
- ret
-
-
-
- ; SCR_SCRDN_ scroll the screen down. the window is scrolled
- ; down nline lines. A zero nline will clear the
- ; window. Top left of the screen in 0,0.
-
- ; Usage: scr_scrdn(nline,fromrow,fromcol,torow,tocol);
-
- public scr_scrdn_
- scr_scrdn_: push bp
- mov bp,sp
- mov al,[bp+4] ;number of lines
- mov ch,[bp+6] ;starting row
- mov cl,[bp+8] ;starting column
- mov dh,[bp+10] ;ending row
- mov dl,[bp+12] ;ending column
- mov bh,scr_attr_ ;current attribute
- mov ah,scrolldn
- int video ;do the scroll
- pop bp
- ret
-
-
-
- ; SCR_CO_ write a character to the screen. this
- ; routine increments the cursor position
- ; after writing. normal C88 puts and printf
- ; statements can also be used to write to the
- ; screen.
-
- ; Usage: scr_co_(character);
-
- public scr_co_
- scr_co_: ; standard console output
- push bp
- mov bp,sp
- mov al,[bp+4] ;character to write
- push ax
- push ax
- mov bh,scr_page_
- mov ah,readcur
- int video
- cmp dl,crt_cols-1
- jle u20
- mov dl,crt_cols-1
- u20: pop ax
- cmp al,8
- je u8
- cmp al,0dh
- je u9
- cmp al,0ah
- je u10
- cmp al,07h
- je u11
- mov bh,scr_page_
- mov bl,scr_attr_
- mov ah,writeach ;use write char/attr routine
- mov cx,1
- int video
- inc dl
- cmp dl,crt_cols
- jnz u7
- dec dl
- jmp u7
-
- ; mov dl,0
- ; cmp dh,24
- ; jnz u6
-
- u1: mov ah,setcur
- mov bh,0
- int video
- mov bh,scr_attr_
- u3: mov ax,0601h
- mov cx,0
- mov dh,24
- mov dl,crt_cols
- dec dl
- u4: int video
- u5: pop ax
- pop bp
- ret
- u6: inc dh
- u7: mov ah,setcur
- jmp u4
- u8: cmp dl,0
- je u7
- dec dl
- jmp u7
- u9: mov dl,0
- jmp u7
- u10: cmp dh,24
- jne u6
- jmp u1
- u11: jmp u5
- ;
- ; SCR_CHR_ATTR_ set screen attribute
- ;
- ; Usage: scr_chr_attr_(character);
- ;
- public scr_chr_attr_
- scr_chr_attr_:
- push bp
- mov bp,sp
- mov al,[bp+4] ;attribute
- cmp al,SETNORMAL
- je norset
- cmp al,SETREVERSE
- je revset
- cmp al,SETBLINK
- je blnkset
- cmp al,SETINTENSE
- je intset
- cmp al,SETFAINT
- je fntset
- cmp al,NOBLINK
- je blnkres
- attfin:
- pop bp
- ret
- norset: mov al,scr_attr_
- and al,136 ;save intensity and blink state
- or al,NORMAL
- mov scr_attr_,al
- jmp attfin
- revset: mov al,scr_attr_
- and al,136
- or al,REVERSE
- mov scr_attr_,al
- jmp attfin
- blnkset:mov al,scr_attr_
- and al,INTENSE
- or al,NORMAL
- or al,BLINK
- mov scr_attr_,al
- jmp attfin
- blnkres:mov al,scr_attr_
- and al,INTENSE
- or al,NORMAL
- mov scr_attr_,al
- jmp attfin
- intset: mov al,scr_attr_
- or al,INTENSE
- mov scr_attr_,al
- jmp attfin
- fntset: mov al,scr_attr_
- and al,247
- mov scr_attr_,al
- jmp attfin
-
-
- ; SCR_CI_ keyboard input. function and soft keys are
- ; translated. see equates for values.
-
- ; Usage: character = scr_ci();
-
- public scr_ci_
- scr_ci_: ;return the next character
- ; translate if necessary
- push bp
- mov ah,cicode ;ask for a keyboard character
- int keyboard
- CMP AH,74
- JE PLUS_KEY
- CMP AH,78
- JE MINUS_KEY
- cmp al,0
- jne not_special
- mov bx, offset convert ; convert special key
- ci_loop:
- cmp byte[bx],0
- jz got_it
- cmp ah, byte[bx]
- je got_it
- add bx,2
- jmp ci_loop
- got_it: inc bx
- mov al,[bx]
- mov ah,0
- pop bp
- ret
- not_special: mov ah,0
- pop bp
- ret
-
- PLUS_KEY: MOV AL,RECORD
- JMP not_special
- MINUS_KEY: MOV AL,REPLAY
- JMP not_special
-
-
-
- ; SCR_CSTS_ return character if any available. otherwise
- ; return zero.
-
- ; Usage: character = scr_csts();
-
- public scr_csts_
- scr_csts_: ;return coded character if any available
- push bp
- mov ah,cstscode
- int keyboard
- mov ax,0
- jz csts_over
- call scr_ci_ ;get the coded character
- csts_over: pop bp
- ret
-